using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace UdpDemo
{
    class UdpServer
    {
        public static async Task RunServer()
        {
            int port = 50789;
            bool portInUse = true;
            
            while (portInUse)
            {
                Console.WriteLine($"UDP监听程序 - 尝试监听{port}端口");
                
                try
                {
                    // 创建UDP服务器
                    using (System.Net.Sockets.UdpClient udpServer = new System.Net.Sockets.UdpClient(port))
                    {
                        Console.WriteLine($"UDP服务已启动，正在监听{port}端口...");
                        Console.WriteLine("按Enter键停止服务");
                        
                        // 端口成功绑定，退出循环
                        portInUse = false;
                        
                        // 启动接收任务
                        var receiveTask = ReceiveDataAsync(udpServer);
                        
                        // 等待用户按下Enter键
                        Console.ReadLine();
                        
                        // 停止服务 - 不需要手动调用Close和Dispose，using语句会自动处理
                    }
            }
            catch (System.Net.Sockets.SocketException ex) when (ex.ErrorCode == 10048)
            {
                Console.WriteLine($"端口{port}已被占用，尝试使用其他端口...");
                port++; // 尝试下一个端口
                if (port > 65535) // 端口号超出范围
                {
                    Console.WriteLine("无法找到可用端口，请稍后再试。");
                    return;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"启动服务时出错: {ex.Message}");
                return;
            }
        }
        }
        
        private static async Task ReceiveDataAsync(System.Net.Sockets.UdpClient udpClient)
        {
            try
            {
                while (true)
                {
                    // 接收数据
                    UdpReceiveResult result = await udpClient.ReceiveAsync();
                    
                    // 获取接收到的数据
                    byte[] data = result.Buffer;
                    
                    // 将数据转换为字符串
                    string receivedText = Encoding.UTF8.GetString(data);
                    
                    // 将数据转换为HEX格式
                    string hexString = BitConverter.ToString(data).Replace("-", " ");
                    
                    // 显示接收到的数据
                    Console.WriteLine($"接收到来自 {result.RemoteEndPoint} 的数据:");
                    Console.WriteLine($"原始文本: {receivedText}");
                    Console.WriteLine($"HEX格式: {hexString}");
                    Console.WriteLine();
                }
            }
            catch (ObjectDisposedException)
            {
                // 正常退出，UDP客户端被关闭
                Console.WriteLine("UDP服务已停止");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"接收数据时出错: {ex.Message}");
            }
        }
    }
}